home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / nihcl-30.lha / nihcl-3.0 / lib / OIOnih.c < prev    next >
C/C++ Source or Header  |  1990-05-19  |  4KB  |  127 lines

  1. /* OIOnih.h -- implementation of "NIH-format" stream Object I/O classes
  2.  
  3.     THIS SOFTWARE FITS THE DESCRIPTION IN THE U.S. COPYRIGHT ACT OF A
  4.     "UNITED STATES GOVERNMENT WORK".  IT WAS WRITTEN AS A PART OF THE
  5.     AUTHOR'S OFFICIAL DUTIES AS A GOVERNMENT EMPLOYEE.  THIS MEANS IT
  6.     CANNOT BE COPYRIGHTED.  THIS SOFTWARE IS FREELY AVAILABLE TO THE
  7.     PUBLIC FOR USE WITHOUT A COPYRIGHT NOTICE, AND THERE ARE NO
  8.     RESTRICTIONS ON ITS USE, NOW OR SUBSEQUENTLY.
  9.  
  10. Author:
  11.     K. E. Gorlen
  12.     Bg. 12A, Rm. 2033
  13.     Computer Systems Laboratory
  14.     Division of Computer Research and Technology
  15.     National Institutes of Health
  16.     Bethesda, Maryland 20892
  17.     Phone: (301) 496-1111
  18.     uucp: uunet!nih-csl!kgorlen
  19.     Internet: kgorlen@alw.nih.gov
  20.     May, 1989
  21.  
  22. Function:
  23.     
  24. Modification History:
  25.  
  26. $Log:    OIOnih.c,v $
  27.  * Revision 3.0  90/05/20  00:20:29  kgorlen
  28.  * Release for 1st edition.
  29.  * 
  30. */
  31.  
  32. #include "OIOnih.h"
  33. #include "OIOTbl.h"
  34.  
  35. static char rcsid[] = "$Header: /afs/alw.nih.gov/unix/sun4_40c/usr/local/src/nihcl-3.0/share/lib/RCS/OIOnih.c,v 3.0 90/05/20 00:20:29 kgorlen Rel $";
  36.  
  37. extern const int NIHCL_DRVDCLASSRSP,NIHCL_ILLEGALMFCN,NIHCL_BADARGCL,
  38.         NIHCL_BADARGSP,NIHCL_BADARGCLM,NIHCL_BADARGSPM,NIHCL_BADCLASS,NIHCL_BADSPEC,
  39.         NIHCL_RDEOF,NIHCL_RDFAIL,NIHCL_RDSYNERR,NIHCL_RDREFERR,NIHCL_RDWRONGCLASS,
  40.     NIHCL_RDUNKCLASS,NIHCL_RDVERSERR,NIHCL_RDABSTCLASS,NIHCL_RDBADSIG,
  41.     NIHCL_RDBADTYP,NIHCL_READBINERR,NIHCL_STOREBINERR,
  42.     NIHCL_READBINUNDFL;
  43.     
  44. Object* OIOnihin::readObject(const Class& expectedClass)
  45. {
  46.     char delim;                // delimiter character 
  47.     const Class* readClass = 0;        // class descriptor pointer
  48.     int objectNum;                // object reference number 
  49.     unsigned short classNum;        // class reference number
  50.     
  51. // read first character of next object on input stream 
  52.     *strm >> delim;
  53.     checkRead();
  54.     
  55. // parse object reference, class reference, or class name & signature
  56.     switch (delim) {
  57.         case '@': {            // read object reference 
  58.             *strm >> objectNum;
  59.             checkRead();
  60. #ifdef DEBUG_OBJIO
  61. cerr << "readFrom: ref to object #" << objectNum
  62.     << ", class " << (Class::readFromTbl->objectAt(objectNum))->className() << '\n';
  63. #endif
  64.             return Class::readFromTbl->objectAt(objectNum);
  65.         }
  66.         case '#': {            // read class reference
  67.             *strm >> classNum >> delim;
  68.             checkRead();
  69.             if (delim != '{') syntaxErr("{",delim);
  70. #ifdef DEBUG_OBJIO
  71. cerr << "readFrom: ref to class #" << classNum << ", class ";
  72. #endif
  73.             readClass = Class::readFromTbl->classAt(classNum);
  74. #ifdef DEBUG_OBJIO
  75. cerr << *readClass << '\n';
  76. #endif
  77.             break;
  78.         }
  79.         case ':': {            // read class name and signature
  80.             unsigned long signature;    // class signature 
  81.             {
  82.                 char clsName[256];
  83.                 strm->get(clsName, sizeof clsName, '.');  *strm >> delim;
  84.                 checkRead();
  85.                 if (delim != '.') syntaxErr(".",delim);
  86.                 *strm >> signature >> delim;
  87.                 checkRead();
  88.                 if (delim != '{') syntaxErr("{",delim);
  89.                 if ((readClass = Class::lookup(clsName)) == 0)
  90.                     setError(NIHCL_RDUNKCLASS, DEFAULT, clsName);
  91.                 if (!readClass->_isKindOf(expectedClass))
  92.                     setError(NIHCL_RDWRONGCLASS, DEFAULT, expectedClass.name(), clsName);
  93.                 if (readClass->signature() != signature)
  94.                     setError(NIHCL_RDBADSIG, DEFAULT, clsName, readClass->signature(), signature);
  95.             }
  96.             classNum = Class::readFromTbl->add(readClass);
  97. #ifdef DEBUG_OBJIO
  98. cerr << "readFrom: class " << *readClass << '\n';
  99. #endif
  100.             break;
  101.         }
  102.         default: syntaxErr(":, # or @",delim);
  103.     }
  104.         
  105. // call class object reader to read object
  106.     Object* target = _readObject(*readClass);
  107.     *strm >> delim;
  108.     checkRead();
  109.     if (delim != '}') syntaxErr("}",delim);
  110.     return target;
  111. }
  112.  
  113. void OIOnihout::storeObject(const Object& obj)
  114. {
  115.     int objectNum;
  116.     if (Class::storeOnTbl->add(obj,objectNum)) {    // object has not been stored 
  117.         unsigned short classNum;
  118.         if (Class::storeOnTbl->addClass(obj.isA(),classNum))    // object of this class has not been previously stored 
  119.             *strm << ':' << obj.className() << '.' << obj.isA()->signature();
  120.         else *strm << '#' << classNum;        // object of this class already stored, just output class reference
  121.         *strm << "{\n";
  122.         _storer(obj);            // call storer for this object 
  123.         *strm << "}\n";
  124.     }
  125.     else *strm << '@' << objectNum << '\n';    // object already stored, just output object reference 
  126. }
  127.